/*
 * Interfaz que representa una tupla de una relación
 */
package grest.model;
import java.util.List;
import java.sql.*;

/**
 *
 * @author Santiago, Rodrigo, Agustín
 */
public interface Entidad {
    /**
     * Obtiene la cantiad de columnas de una tupla
     * @return int
     */
    public int getColumnCount();
    /**
     * Devuelve la clase de una columna
     * @param columna
     * @return Class
     */
    public Class getColumnClass(int columna);
    /**
     * Determina si el objeto sufrió cambios
     * @return 
     */
    public boolean isChanged();
    /**
     * Establece a un objeto como modificado
     */
    public void setChanged(boolean modificado);
    /**
     * Determina si la columna especificada es editable
     * @param columna
     * @return boolean
     */
    public boolean isColumnEditable(int columna);
    /**
     * Devuelve el nombre de un atributo de una entidad
     * @param columna
     * @return 
     */
    public String getColumnTitle(int columna);
    /**
     * Devuelve el valor de un atributo de una tupla determinada
     * @param tipoEntidad
     * @param fila
     * @param columna
     * @return 
     */
    public Object getColumnValue(List<Entidad> tipoEntidad,int fila,int columna);
    /**
     * Establece el valor de un atributo de una tupla determinada
     * @param tipoEntidad
     * @param fila
     * @param columna
     * @param valor 
     */
    public void setColumnValue(List<Entidad> tipoEntidad,int fila, int columna,Object valor);
    /**
     * Incializa el modelo de datos
     * @param tipoEntidad
     * @param tuplas 
     */
    public void loadTuplas(List<Entidad> tipoEntidad, ResultSet tuplas) throws SQLException;
    /**
     * Devuelve el query SQL para la insercción de tuplas
     * @return String
     */
    public String getInsertQuery();
    /**
     * Devuelve el query SQL para imorimir todas las tuplas
     * de una tabla
     * @return String
     */
    public String getSelectQuery();
    /**
     * Devuelve el query SQL para la actualización de tuplas
     * @return String
     */
    public String getUpdateQuery();
    /**
     * Devuelve el query SQL para la eliminación de tuplas
     * @return String
     */
    public String getDeleteQuery();
    /**
     * Marca entidades no persistidas (Insercción)
     * @param mod 
     */
    public void setPreChanged(boolean mod); 
    /**
     * Determina si la tupla debe ser insertada
     * @return boolean
     */
    public boolean isPreChanged();
    /**
     * Agrega una tupla vacía con el siguiente identificador
     * en el modelo, sin persistir los cambios
     * @return 
     */
    public String onPreInsertQuery();
    /**
     * Establece el ID de una entidad
     * @param id 
     */
    public void setID(Object id);
}
